/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef __NAT_H__
#define __NAT_H__
#include <string>
// #include <iostream>
#include <sstream>
#include <stdint.h>

using namespace std;

// Nat五元组(网络地址转换)，用于当客户端发起请求时，查询目标服务链路信息
struct NatMate {
	string GatewayIP;   // 目标服务网关IP
	ushort GatewayPort; // 目标服务网关Port
	string Name;        // 目标服务
	string ServiceIP;   // 目标服务内网IP
	ushort ServicePort; // 目标服务内网Port

	// 构造函数
	NatMate() = default;
	NatMate(string gatewayIP, ushort gatewayPort, string name, string serviceIP, ushort servicePort) :
	    GatewayIP(gatewayIP), GatewayPort(gatewayPort), Name(name), ServiceIP(serviceIP), ServicePort(servicePort) {}

	string hashKey() const {
		std::stringstream ss;
		ss << GatewayIP << GatewayPort << Name << ServiceIP << ServicePort;
		return ss.str();
	}

	string encode() const {
		std::stringstream ss;
		ss << GatewayIP << "|" << GatewayPort << "|" << Name << "|" << ServiceIP << "|" << ServicePort;
		return ss.str();
	}

	static NatMate decode(const string &str) {
		std::stringstream ss(str);
		NatMate           ri;
		string            temp;
		std::getline(ss, ri.GatewayIP, '|');
		std::getline(ss, temp, '|');
		ri.GatewayPort = static_cast<uint16_t>(std::stoi(temp));

		std::getline(ss, ri.Name, '|');
		std::getline(ss, ri.ServiceIP, '|');
		std::getline(ss, temp, '|');
		ri.ServicePort = static_cast<uint16_t>(std::stoi(temp));
		return ri;
	}
};


// 代理创建事件
struct AgentedEvent {
	NatMate &mate;
	int      sockFd;
	ushort   sockPort;

	AgentedEvent(NatMate &mate, int sockFd, ushort sockPort) : mate(mate), sockFd(sockFd), sockPort(sockPort) {}
	friend ostream &operator<<(ostream &os, const AgentedEvent &event) {
		os << "AgentedEvent: " << event.mate.encode() << " sockFd: " << event.sockFd << " sockPort: " << event.sockPort;
		return os;
	}
};

#endif //__NAT_H__
